home *** CD-ROM | disk | FTP | other *** search
- #! /bin/bash
-
- # Copyright 1999-2005 Gentoo Foundation
- # $Header$
-
- # revdep-rebuild: Reverse dependency rebuilder.
- # Original Author: Stanislav Brabec
- # Current Maintainer: Paul Varner <fuzzyray@gentoo.org>
-
- # Known problems:
- #
- # In exact ebuild mode revdep-rebuild can fail to properly order packages,
- # which are not up to date.
- # http://bugs.gentoo.org/show_bug.cgi?id=23018
- #
- # Rebuilding using --package-names mode should be default, but emerge has no
- # feature to update to latest version of defined SLOT.
- # http://bugs.gentoo.org/show_bug.cgi?id=4698
-
- # Customizable variables:
- #
- # LD_LIBRARY_MASK - Mask of specially evaluated libraries
- # SEARCH_DIRS - List of directories to search for executables and libraries
- # SEARCH_DIRS_MASK - List of directories to not search
- #
- # These variables can be prepended to either by setting the variable in
- # your environment prior to execution, or by placing an entry in
- # /etc/make.conf.
- #
- # An entry of "-*" means to clear the variable from that point forward.
- # Example: env SEARCH_DIRS="/usr/bin -*" revdep-rebuild will set SEARCH_DIRS
- # to contain only /usr/bin
-
- if [ "$1" = "-h" -o "$1" = "--help" ]
- then
- echo "Usage: $0 [OPTIONS] [--] [EMERGE_OPTIONS]"
- echo
- echo "Broken reverse dependency rebuilder."
- echo
- echo " -X, --package-names Emerge based on package names, not exact versions"
- echo " --library NAME Emerge existing packages that use the library with NAME"
- echo " --library=NAME NAME can be a full path to the library or a basic"
- echo " regular expression (man grep)"
- echo " -nc, --no-color Turn off colored output"
- echo " -i, --ignore Ignore temporary files from previous runs"
- echo " -q, --quiet Be less verbose (also passed to emerge command)"
- echo " -vv, --extra-verbose Be extra verbose"
- echo
- echo "Calls emerge, all other options are used for it (e. g. -p, --pretend)."
- echo
- echo "Report bugs to <http://bugs.gentoo.org>"
- exit 0
- fi
-
- echo "Configuring search environment for revdep-rebuild"
-
- # Obey PORTAGE_NICENESS
- PORTAGE_NICENESS=$(portageq envvar PORTAGE_NICENESS)
- [ ! -z "$PORTAGE_NICENESS" ] && renice $PORTAGE_NICENESS $$ > /dev/null
-
- # Update the incremental variables using /etc/profile.env, /etc/ld.so.conf,
- # portage, and the environment
-
- # Read the incremental variables from environment and portage
- # Until such time as portage supports these variables as incrementals
- # The value will be what is in /etc/make.conf
- PRELIMINARY_SEARCH_DIRS="$SEARCH_DIRS $(portageq envvar SEARCH_DIRS)"
- PRELIMINARY_SEARCH_DIRS_MASK="$SEARCH_DIRS_MASK $(portageq envvar SEARCH_DIRS_MASK)"
- PRELIMINARY_LD_LIBRARY_MASK="$LD_LIBRARY_MASK $(portageq envvar LD_LIBRARY_MASK)"
-
- # Add the defaults
- if [ -d /etc/revdep-rebuild ]
- then
- for file in $(ls /etc/revdep-rebuild)
- do
- PRELIMINARY_SEARCH_DIRS="$PRELIMINARY_SEARCH_DIRS $(. /etc/revdep-rebuild/${file}; echo $SEARCH_DIRS)"
- PRELIMINARY_SEARCH_DIRS_MASK="$PRELIMINARY_SEARCH_DIRS_MASK $(. /etc/revdep-rebuild/${file}; echo $SEARCH_DIRS_MASK)"
- PRELIMINARY_LD_LIBRARY_MASK="$PRELIMINARY_LD_LIBRARY_MASK $(. /etc/revdep-rebuild/${file}; echo $LD_LIBRARY_MASK)"
- done
- else
- PRELIMINARY_SEARCH_DIRS="$PRELIMINARY_SEARCH_DIRS /bin /sbin /usr/bin /usr/sbin /lib* /usr/lib*"
- PRELIMINARY_SEARCH_DIRS_MASK="$PRELIMINARY_SEARCH_DIRS_MASK /opt/OpenOffice /usr/lib/openoffice"
- PRELIMINARY_LD_LIBRARY_MASK="$PRELIMINARY_LD_LIBRARY_MASK libodbcinst.so libodbc.so libjava.so libjvm.so"
- fi
-
- # Get the ROOTPATH and PATH from /etc/profile.env
- if [ -e "/etc/profile.env" ]
- then
- PRELIMINARY_SEARCH_DIRS="$PRELIMINARY_SEARCH_DIRS $((. /etc/profile.env; echo ${ROOTPATH}:${PATH}) | tr ':' ' ')"
- fi
-
- # Get the directories from /etc/ld.so.conf
- if [ -e /etc/ld.so.conf ]
- then
- PRELIMINARY_SEARCH_DIRS="$PRELIMINARY_SEARCH_DIRS $(grep -v "^#" /etc/ld.so.conf | tr '\n' ' ')"
- fi
-
- # Set the final variables
- # Note: Using $(echo $variable) removes extraneous spaces from variable assignment
- unset SEARCH_DIRS
- for i in $(echo $PRELIMINARY_SEARCH_DIRS)
- do
- [ "$i" = "-*" ] && break
- # Append a / at the end so that links and directories are treated the same by find
- # Remove any existing trailing slashes to prevent double-slashes
- SEARCH_DIRS="$(echo $SEARCH_DIRS ${i/%\//}/)"
- done
-
- unset SEARCH_DIRS_MASK
- for i in $(echo $PRELIMINARY_SEARCH_DIRS_MASK)
- do
- [ "$i" = "-*" ] && break
- SEARCH_DIRS_MASK="$(echo $SEARCH_DIRS_MASK $i)"
- done
-
- unset LD_LIBRARY_MASK
- for i in $(echo $PRELIMINARY_LD_LIBRARY_MASK)
- do
- [ "$i" = "-*" ] && break
- LD_LIBRARY_MASK="$(echo $LD_LIBRARY_MASK $i)"
- done
-
- # Use the color preference from portage
- NOCOLOR=$(portageq envvar NOCOLOR)
-
- # Base of temporary files names.
- LIST=~/.revdep-rebuild
-
- shopt -s nullglob
- shopt -s expand_aliases
- unalias -a
-
- # Color Definitions
- NO="\x1b[0m"
- BR="\x1b[0;01m"
- CY="\x1b[36;01m"
- GR="\x1b[32;01m"
- RD="\x1b[31;01m"
- YL="\x1b[33;01m"
- BL="\x1b[34;01m"
-
- alias echo_v=echo
-
- PACKAGE_NAMES=false
- SONAME="not found"
- SONAME_GREP=grep
- SEARCH_BROKEN=true
- EXTRA_VERBOSE=false
- KEEP_TEMP=false
-
- EMERGE_OPTIONS=""
- PRELIMINARY_CALLED_OPTIONS=""
- while [ ! -z "$1" ] ; do
- case "$1" in
- -X | --package-names )
- PACKAGE_NAMES=true
- PRELIMINARY_CALLED_OPTIONS="${PRELIMINARY_CALLED_OPTIONS} --package_names"
- shift
- ;;
- -q | --quiet )
- alias echo_v=:
- EMERGE_OPTIONS="${EMERGE_OPTIONS} $1"
- shift
- ;;
- --library=* | --soname=* | --soname-regexp=* )
- SONAME="${1#*=}"
- SEARCH_BROKEN=false
- PRELIMINARY_CALLED_OPTIONS="${PRELIMINARY_CALLED_OPTIONS} --library=${SONAME}"
- shift
- ;;
- --library | --soname | --soname-regexp )
- SONAME="$2"
- SEARCH_BROKEN=false
- PRELIMINARY_CALLED_OPTIONS="${PRELIMINARY_CALLED_OPTIONS} --library=${SONAME}"
- shift 2
- ;;
- -nc | --no-color )
- NOCOLOR=true
- shift
- ;;
- -i | --ignore )
- rm -f ${LIST}*
- shift
- ;;
- --keep-temp )
- KEEPTEMP=true
- shift
- ;;
- -vv | --extra-verbose )
- EXTRA_VERBOSE=true
- shift
- ;;
- -- )
- shift
- ;;
- * )
- EMERGE_OPTIONS="${EMERGE_OPTIONS} $1"
- shift
- ;;
- esac
- done
-
- EMERGE_OPTIONS=$(echo $EMERGE_OPTIONS | sed 's/^ //')
-
- if [ -z "$PRELIMINARY_CALLED_OPTIONS" ]
- then
- CALLED_OPTIONS=""
- else
- for i in $(echo $PRELIMINARY_CALLED_OPTIONS | tr ' ' '\n'| sort)
- do
- CALLED_OPTIONS="$(echo $CALLED_OPTIONS $i)"
- done
- fi
-
- if [ "$NOCOLOR" = "yes" -o "$NOCOLOR" = "true" ]
- then
- NOCOLOR=true
- else
- NOCOLOR=false
- fi
-
- # Make the NOCOLOR variable visible to emerge
- export NOCOLOR
-
- if $NOCOLOR
- then
- NO=""
- BR=""
- CY=""
- GR=""
- RD=""
- YL=""
- BL=""
- fi
-
- function set_trap () {
- trap "rm_temp $1" SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
- }
-
- function rm_temp () {
- echo " terminated."
- echo "Removing incomplete $1."
- rm $1
- echo
- exit 1
- }
-
- if $SEARCH_BROKEN ; then
- SONAME_SEARCH="$SONAME"
- LLIST=$LIST
- HEAD_TEXT="broken by a package update"
- OK_TEXT="Dynamic linking on your system is consistent"
- WORKING_TEXT=" consistency"
- else
- # first case is needed to test against /path/to/foo.so
- if [ ${SONAME:0:1} == '/' ] ; then
- # Set to "<space>$SONAME<space>"
- SONAME_SEARCH=" $SONAME "
- else
- # Set to "<tab>$SONAME<space>"
- SONAME_SEARCH=" $SONAME "
- fi
- LLIST=${LIST}_$(echo "$SONAME_SEARCH$SONAME" | md5sum | head -c 8)
- HEAD_TEXT="using $SONAME"
- OK_TEXT="There are no dynamic links to $SONAME"
- WORKING_TEXT=""
- fi
-
- # If any of our temporary files are older than 1 day, remove them all
- [ "$(find "${LIST%/*}/." ! -name . -prune -name "${LIST##*/}*" -type f -mmin +1440)" != "" ] && rm -f ${LIST}*
-
- # Don't use our previous files if environment doesn't match
- if [ -f $LIST.0_env ]
- then
- PREVIOUS_SEARCH_DIRS=$(. ${LIST}.0_env; echo "$SEARCH_DIRS")
- PREVIOUS_SEARCH_DIRS_MASK=$(. ${LIST}.0_env; echo "$SEARCH_DIRS_MASK")
- PREVIOUS_LD_LIBRARY_MASK=$(. ${LIST}.0_env; echo "$LD_LIBRARY_MASK")
- PREVIOUS_OPTIONS=$(. ${LIST}.0_env; echo "$CALLED_OPTIONS")
- if [ "$PREVIOUS_SEARCH_DIRS" != "$SEARCH_DIRS" ] || \
- [ "$PREVIOUS_SEARCH_DIRS_MASK" != "$SEARCH_DIRS_MASK" ] || \
- [ "$PREVIOUS_LD_LIBRARY_MASK" != "$LD_LIBRARY_MASK" ] || \
- [ "$PREVIOUS_OPTIONS" != "$CALLED_OPTIONS" ]
- then
- echo
- echo "Environment mismatch from previous run, deleting temporary files..."
- rm -f ${LIST}*
- fi
- fi
-
- # Log our environment
- echo "SEARCH_DIRS=\"$SEARCH_DIRS\"" > $LIST.0_env
- echo "SEARCH_DIRS_MASK=\"$SEARCH_DIRS_MASK\"" >> $LIST.0_env
- echo "LD_LIBRARY_MASK=\"$LD_LIBRARY_MASK\"" >> $LIST.0_env
- echo "CALLED_OPTIONS=\"$CALLED_OPTIONS\"" >> $LIST.0_env
- echo "EMERGE_OPTIONS=\"$EMERGE_OPTIONS\"" >> $LIST.0_env
-
- if $EXTRA_VERBOSE
- then
- echo
- echo "revdep-rebuild environment:"
- cat $LIST.0_env
- fi
-
- echo
- echo "Checking reverse dependencies..."
- echo
- echo "Packages containing binaries and libraries $HEAD_TEXT"
- echo "will be emerged."
-
- echo
- echo -n -e "${GR}Collecting system binaries and libraries...${NO}"
-
- if [ -f $LIST.1_files ]
- then
- echo " using existing $LIST.1_files."
- else
- # Be safe and remove any extraneous temporary files
- rm -f ${LIST}.[1-9]_*
-
- set_trap "$LIST.1_*"
-
- # Hack for broken versions of find. I'm using a case statement in case I have to add more
- find_version=$(find --version 2>/dev/null | awk '/find/ {print $NF}')
- case "$find_version" in
- 4.2.25 | 4.2.27 )
- find $SEARCH_DIRS -type f \( -perm /u+x -o -name '*.so' -o -name '*.so.*' \) 2>/dev/null | sort | uniq >$LIST.0_files
- ;;
- * )
- find $SEARCH_DIRS -type f \( -perm +u+x -o -name '*.so' -o -name '*.so.*' \) 2>/dev/null | sort | uniq >$LIST.0_files
- ;;
- esac
-
- # Remove files that match SEARCH_DIR_MASK
- for dir in $SEARCH_DIRS_MASK
- do
- grep -v "^$dir" $LIST.0_files > $LIST.1_files
- mv $LIST.1_files $LIST.0_files
- done
-
- mv $LIST.0_files $LIST.1_files
- echo -e " done.\n ($LIST.1_files)"
- fi
-
- if $SEARCH_BROKEN ; then
- echo
- echo -n -e "${GR}Collecting complete LD_LIBRARY_PATH...${NO}"
- if [ -f $LIST.2_ldpath ] ; then
- echo " using existing $LIST.2_ldpath."
- else
- set_trap "$LIST.2_ldpath"
- # Ensure that the "trusted" lib directories are at the start of the path
- (
- echo /lib* /usr/lib* | sed 's/ /:/g'
- sed '/^#/d;s/#.*$//' </etc/ld.so.conf
- sed 's:/[^/]*$::' <$LIST.1_files | sort -ru
- ) | tr '\n' : | tr -d '\r' | sed 's/:$//' >$LIST.2_ldpath
- echo -e " done.\n ($LIST.2_ldpath)"
- fi
- export COMPLETE_LD_LIBRARY_PATH="$(cat $LIST.2_ldpath)"
- fi
-
- echo
- echo -n -e "${GR}Checking dynamic linking$WORKING_TEXT...${NO}"
- if [ -f $LLIST.3_rebuild ] ; then
- echo " using existing $LLIST.3_rebuild."
- else
- echo_v
- set_trap "$LLIST.3_rebuild"
- LD_MASK="\\( $(echo "$LD_LIBRARY_MASK" | sed 's/\./\\./g;s/ / \\| /g') \\)"
- echo -n >$LLIST.3_rebuild
- cat $LIST.1_files | while read FILE ; do
- # Note: double checking seems to be faster than single
- # with complete path (special add ons are rare).
- if ldd "$FILE" 2>/dev/null | grep -v "$LD_MASK" | $SONAME_GREP -q "$SONAME_SEARCH" ; then
- if $SEARCH_BROKEN ; then
- if LD_LIBRARY_PATH="$COMPLETE_LD_LIBRARY_PATH" ldd "$FILE" 2>/dev/null | grep -v "$LD_MASK" | $SONAME_GREP -q "$SONAME_SEARCH" ; then
- # FIX: I hate duplicating code
- # Only build missing direct dependencies
- ALL_MISSING_LIBS=$(ldd "$FILE" 2>/dev/null | sort -u | sed -n 's/ \(.*\) => not found/\1/p' | tr '\n' ' ' | sed 's/ $//' )
- REQUIRED_LIBS=$(objdump -x $FILE | grep NEEDED | awk '{print $2}' | tr '\n' ' ' | sed 's/ $//')
- MISSING_LIBS=""
- for lib in $ALL_MISSING_LIBS
- do
- if echo $REQUIRED_LIBS | grep -q $lib
- then
- MISSING_LIBS="$MISSING_LIBS $lib"
- fi
- done
- if [ "$MISSING_LIBS" != "" ]
- then
- echo "$FILE" >>$LLIST.3_rebuild
- echo_v " broken $FILE (requires ${MISSING_LIBS})"
- fi
- fi
- else
- # FIX: I hate duplicating code
- # Only rebuild for direct dependencies
- ALL_MISSING_LIBS=$(ldd "$FILE" 2>/dev/null | sort -u | $SONAME_GREP "$SONAME_SEARCH" | awk '{print $1}' | tr '\n' ' ' | sed 's/ $//' )
- REQUIRED_LIBS=$(objdump -x $FILE | grep NEEDED | awk '{print $2}' | tr '\n' ' ' | sed 's/ $//')
- MISSING_LIBS=""
- for lib in $ALL_MISSING_LIBS
- do
- if echo $REQUIRED_LIBS | grep -q $lib
- then
- MISSING_LIBS="$MISSING_LIBS $lib"
- fi
- done
- if [ "$MISSING_LIBS" != "" ]
- then
- echo "$FILE" >>$LLIST.3_rebuild
- echo_v " found $FILE"
- fi
- fi
- fi
- done
- echo -e " done.\n ($LLIST.3_rebuild)"
- fi
-
- if $PACKAGE_NAMES ; then
- EXACT_EBUILDS=false
-
- echo
- echo -n -e "${GR}Assigning files to packages...${NO}"
- if [ -f $LLIST.4_packages_raw ] ; then
- echo " using existing $LLIST.4_packages_raw."
- else
- set_trap "$LLIST.4_packages*"
- echo -n >$LLIST.4_packages_raw
- echo -n >$LLIST.4_package_owners
- cat $LLIST.3_rebuild | while read FILE ; do
- EXACT_PKG="$(echo $FILE | sed 's/^/obj /' | (cd /var/db/pkg; grep -l -f - */*/CONTENTS) | sed s:/CONTENTS:: )"
- # Ugly sed hack to strip version information
- PKG="$(echo $EXACT_PKG | sed 's/-r[0-9].*$//;s/\(^.*\/*\)-.*$/\1/')"
- if [ -z "$PKG" ] ; then
- echo -n -e "\n ${RD}*** $FILE not owned by any package is broken! ***${NO}"
- echo "$FILE -> (none)" >> $LLIST.4_package_owners
- echo_v -n -e "\n $FILE -> (none)"
- else
- echo "$EXACT_PKG" >> $LLIST.4_packages_raw
- echo "$FILE -> $EXACT_PKG" >> $LLIST.4_package_owners
- echo_v -n -e "\n $FILE -> $PKG"
- fi
- done
- echo_v
- echo -e " done.\n ($LLIST.4_packages_raw, $LLIST.4_package_owners)"
- fi
-
- echo
- echo -n -e "${GR}Cleaning list of packages to rebuild...${NO}"
- if [ -f $LLIST.4_packages ] ; then
- echo " using existing $LLIST.4_packages."
- else
- sort -u $LLIST.4_packages_raw >$LLIST.4_packages
- echo -e " done.\n ($LLIST.4_packages)"
- fi
-
- echo
- echo -n -e "${GR}Assigning packages to ebuilds...${NO}"
- if [ -f $LLIST.4_ebuilds ] ; then
- echo " using existing $LLIST.4_ebuilds."
- else
- if [ -s "$LLIST.4_packages" ]
- then
- set_trap "$LLIST.4_ebuilds"
- cat $LLIST.4_packages | while read EXACT_PKG
- do
- # Get the slot
- PKG="$(echo $EXACT_PKG | sed 's/-r[0-9].*$//;s/\(^.*\/*\)-.*$/\1/')"
- SLOT=$(cat /var/db/pkg/${EXACT_PKG}/SLOT)
- # If SLOT is equal to 0, then just see what portage says is latest version
- if [ "$SLOT" = "0" ]
- then
- emerge --nospinner --pretend --nodeps $PKG | sed -n 's/ //g;s/\[[^]]*\]//gp'
- continue
- fi
- # Otherwise mask the other SLOTTED versions and check for latest
- OTHER_VERSIONS=$(/usr/lib/gentoolkit/bin/find_pkgs.py $PKG | grep -v "($SLOT)" | awk '{print $2}')
- if [ -f /etc/portage/package.mask ]
- then
- mv -f /etc/portage/package.mask /etc/portage/package.mask.revdep-rebuild.backup
- else
- # Make sure that /etc/portage/package.mask exists
- mkdir -p /etc/portage
- touch /etc/portage/package.mask
- fi
- for pkg_version in $(echo $OTHER_VERSIONS | tr '\n' ' ')
- do
- echo "=${PKG}-${pkg_version}" >> /etc/portage/package.mask
- done
- emerge --nospinner --pretend --nodeps $PKG | sed -n 's/ //g;s/\[[^]]*\]//gp'
- if [ -f /etc/portage/package.mask.revdep-rebuild.backup ]
- then
- mv -f /etc/portage/package.mask.revdep-rebuild.backup /etc/portage/package.mask
- else
- rm -f /etc/portage/package.mask
- fi
- done > $LLIST.4_ebuilds
- echo -e " done.\n ($LLIST.4_ebuilds)"
- else
- echo " Nothing to rebuild"
- echo -n > $LLIST.4_ebuilds
- fi
- fi
- else
- EXACT_EBUILDS=true
-
- echo
- echo -n -e "${GR}Assigning files to ebuilds...${NO}"
- if [ -f $LLIST.4_ebuilds ] ; then
- echo " using existing $LLIST.4_ebuilds."
- else
- if [ -s "$LLIST.3_rebuild" ] ; then
- set_trap "$LLIST.4_ebuilds"
- cat $LLIST.3_rebuild | sed 's/^/obj /;s/$/ /' |
- (
- cd /var/db/pkg
- fgrep -l -f - */*/CONTENTS
- ) | sed s:/CONTENTS:: > $LLIST.4_ebuilds
- echo -e " done.\n ($LLIST.4_ebuilds)"
- else
- echo " Nothing to rebuild"
- echo -n > $LLIST.4_ebuilds
- fi
- fi
-
- fi
-
- echo
- echo -n -e "${GR}Evaluating package order...${NO}"
- if [ -f $LLIST.5_order ] ; then
- echo " using existing $LLIST.5_order."
- else
- RAW_REBUILD_LIST="$(cat $LLIST.4_ebuilds | sed s/^/=/ | tr '\n' ' ')"
- if [ ! -z "$RAW_REBUILD_LIST" ] ; then
- REBUILD_GREP="^\\($( (emerge --nospinner --pretend --oneshot --nodeps $RAW_REBUILD_LIST ; echo $? >$LLIST.5_status ) | sed -n 's/\./\\&/g;s/ //g;s/$/\\/;s/\[[^]]*\]//gp' | tr '\n' '|' | sed 's/|$//'))\$"
- if [ $(cat $LLIST.5_status) -gt 0 ] ; then
- echo ""
- echo -e "${RD}Warning: Failed to resolve package order."
- echo -e "Will merge in \"random\" order!${NO}"
- echo "Possible reasons:"
- echo "- An ebuild is no longer in the portage tree."
- echo "- An ebuild is masked, use /etc/portage/packages.keyword"
- echo " and/or /etc/portage/package.unmask to unmask it"
- for i in . . . . . ; do
- echo -n -e '\a.'
- sleep 1
- done
- ln -f $LLIST.4_ebuilds $LLIST.5_order
- else
- emerge --nospinner --pretend --oneshot --emptytree $RAW_REBUILD_LIST | sed -n 's/ //g;s/^.*\]//p' | grep "$REBUILD_GREP" >$LLIST.5_order
- fi
- else
- echo -n "" >$LLIST.5_order
- fi
- echo -e " done.\n ($LLIST.5_order)"
- fi
-
- REBUILD_LIST="$(cat $LLIST.5_order | sed s/^/=/ | tr '\n' ' ')"
-
- trap - SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
-
- if [ -z "$REBUILD_LIST" ] ; then
- echo -e "\n${GR}$OK_TEXT... All done.${NO} "
- if [ ! $KEEPTEMP ]
- then
- rm $LIST.[0-2]_*
- rm $LLIST.[3-9]_*
- fi
- exit 0
- fi
-
- IS_REAL_MERGE=true
- echo " $EMERGE_OPTIONS " | grep -q '\( -p \| --pretend \| -f \| --fetchonly \)' && IS_REAL_MERGE=false
-
- echo
- echo -e "${GR}All prepared. Starting rebuild...${NO}"
-
- echo "emerge --oneshot $EMERGE_OPTIONS $REBUILD_LIST"
-
- if $IS_REAL_MERGE ; then
- for i in . . . . . . . . . . ; do
- echo -n -e '\a.'
- sleep 1
- done
- echo
- fi
-
- #if $EXACT_EBUILDS ; then
- # Uncomment following, if you want to recompile masked ebuilds.
- ## FIXME: Check for PORTDIR_OVERLAY
- # echo -e "${GR}Temporarilly disabling package mask...${NO}"
- # trap "mv -i /usr/portage/profiles/package.mask.hidden /usr/portage/profiles/package.mask ; echo -e "\\n\\nTerminated." ; exit 1" \
- # SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
- # mv -i /usr/portage/profiles/package.mask /usr/portage/profiles/package.mask.hidden
- #fi
-
- # Run in background to correctly handle Ctrl-C
- (
- emerge --oneshot $EMERGE_OPTIONS $REBUILD_LIST
- echo $? >$LLIST.6_status
- ) &
- wait
-
- #if $EXACT_EBUILDS ; then
- # mv -i /usr/portage/profiles/package.mask.hidden /usr/portage/profiles/package.mask
- # trap - SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
- #fi
-
- if [ "$(cat $LLIST.6_status)" -gt 0 ] ; then
- echo
- echo -e "${RD}revdep-rebuild failed to emerge all packages${NO}"
- echo -e "${RD}you have the following choices:${NO}"
- echo
- echo "- if emerge failed during the build, fix the problems and re-run revdep-rebuild"
- echo " or"
- echo "- use -X or --package-names as first argument (trys to rebuild package, not exact"
- echo " ebuild)"
- echo " or"
- echo "- set ACCEPT_KEYWORDS=\"~<your platform>\" and/or /etc/portage/package.unmask"
- echo " (and remove $LLIST.5_order to be evaluated again)"
- echo " or"
- echo "- modify the above emerge command and run it manually"
- echo " or"
- echo "- compile or unmerge unsatisfied packages manually, remove temporary files and"
- echo " try again (you can edit package/ebuild list first)"
- echo
- echo -e "${GR}To remove temporary files, please run:${NO}"
- echo "rm $LIST*.?_*"
- exit $(cat $LLIST.6_status)
- else
- if $IS_REAL_MERGE ; then
- trap "echo -e \" terminated. Please remove them manually:\nrm $LIST*.?_*\" ; exit 1" \
- SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
- echo -n -e "${GR}Build finished correctly. Removing temporary files...${NO} "
- echo
- rm $LIST.[0-2]_*
- rm $LLIST.[3-9]_*
- echo "You can re-run revdep-rebuild to verify that all libraries and binaries"
- echo "are fixed. If some inconsistency remains, it can be orphaned file, deep"
- echo "dependency, binary package or specially evaluated library."
- else
- echo -e "${GR}Now you can remove -p (or --pretend) from arguments and re-run revdep-rebuild.${NO}"
- fi
- fi
- exit 0
-